package com.toonan.system.service;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import com.toonan.core.cache.WebplusCache;
import com.toonan.core.constant.WebplusCons;
import com.toonan.core.matatype.Dto;
import com.toonan.core.token.WebplusToken;
import com.toonan.core.util.WebplusMongo;
import com.toonan.core.util.WebplusUtil;
import com.toonan.core.vo.PageResult;
import com.toonan.core.vo.R;
import com.toonan.core.vo.UserToken;
import com.toonan.system.constant.SystemCons;
import com.toonan.system.dao.DeptDao;
import com.toonan.system.dao.RoleUserDao;
import com.toonan.system.dao.UserDao;
import com.toonan.system.model.Dept;
import com.toonan.system.model.User;

@Service
public class UserService {
	
	@Autowired
	private UserDao userDao;
	@Autowired
	private DeptDao deptDao;
	@Autowired
	private RoleUserDao roleUserDao;
	
	
	/**
	 * 
	 * 简要说明：分页查询
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月3日 下午10:58:50 
	 * @param 说明
	 * @return 说明
	 */
	@SuppressWarnings("unchecked")
	public PageResult findPage(Dto pDto) {
		Query query=new Query();
		String cascadeId=pDto.getString("cascadeId");
		List<String> deptIdList=deptDao.listDeptIdByCascadeId(cascadeId);
		String outRoleId=pDto.getString("outRoleId");
		if(WebplusUtil.isNotEmpty(outRoleId)) {
			
			List<String> userIdList=roleUserDao.listUserIdByRoleId(outRoleId);
			WebplusMongo.nin(query, "_id", userIdList);;
		}
		String inRoleId=pDto.getString("inRoleId");
		if(WebplusUtil.isNotEmpty(inRoleId)) {
			
			List<String> userIdList=roleUserDao.listUserIdByRoleId(inRoleId);
		    if(WebplusUtil.isEmpty(userIdList)) {
		    	userIdList.add("_id");
		    	
		    }
		    WebplusMongo.in(query, "_id", userIdList);
		}
		WebplusMongo.in(query, "deptId",deptIdList);
 		WebplusMongo.like(query, "account", pDto);
		WebplusMongo.like(query, "username", pDto);
		WebplusMongo.like(query, "mobile", pDto);
		WebplusMongo.eq(query, "status", pDto);
		WebplusMongo.eq(query, "deptId", pDto);
		WebplusMongo.eq(query,"isDel", WebplusCons.WHETHER_NO);
		
		WebplusMongo.gte(query, "careteTimeBegin", pDto);
		WebplusMongo.ltDate(query, "createTimeDate", pDto);
		WebplusMongo.withSortDesc(query, "createTime");
		PageResult pageResult=new PageResult(pDto);
		this.userDao.findPage(query, pageResult);
		this.mergeDeptName((List<User>)pageResult.getDataList());
		return pageResult;
	}
	/**
	 * 
	 * 简要说明：合并组织机构
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月7日 下午10:52:14 
	 * @param 说明
	 * @return 说明
	 */
	 public void mergeDeptName(List<User> userList) {
	    	if(WebplusUtil.isNotEmpty(userList)) {
	    		List<String> deptIdList=WebplusUtil.getListByKey(userList, "deptId");
	    		Query query=new Query();
	    		WebplusMongo.in(query, "deptId", deptIdList);
	    		List<Dept> deptList=deptDao.findList(query);
	    		for(User user:userList) {
	    			String deptName=this.getDeptName(user.getDeptId(), deptList);
	    			user.setDeptName(deptName);
	    		}
	    	}
	  }
	 /**
	  * 
	  * 简要说明：合并组织机构
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年3月7日 下午10:57:25 
	  * @param 说明
	  * @return 说明
	  */
	 public String  getDeptName(String deptId,List<Dept> deptList) {
		 for(Dept dept:deptList) {
			 if(deptId.equals(dept.getDeptId())) {
				
				 return dept.getDeptName();
			 }
		 }
		 return "";
	 }
	 
    /**
     * 
     * 简要说明：插入一个用户
     * 编写者：陈骑元（chenqiyuan@toonan.com）
     * 创建时间： 2022年3月3日 下午11:12:06 
     * @param 说明
     * @return 说明
     */
	public boolean insert(User user) {
		
		User userDb=userDao.insert(user);
		if(WebplusUtil.isNotEmpty(userDb.getUserId())) {
			return true;
		}
		return false;
	}
	/**
	 * 
	 * 简要说明：校验账号唯一性 存在返回true
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月13日 上午10:08:08 
	 * @param 说明  account 账号  
	 * @return 说明 
	 */
	public boolean checkAccountUnion(String account) {
		Query query=WebplusMongo.eq("account", account);
		WebplusMongo.eq(query, "isDel", WebplusCons.WHETHER_NO);
		
		return this.userDao.count(query)>0;
	}
	/**
	 * 
	 * 简要说明：根绝查询一个用户编号
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月3日 下午11:13:00 
	 * @param 说明
	 * @return 说明
	 */
	public User findById(String id) {
		
		return this.userDao.findById(id);
	}
	/**
	 * 
	 * 简要说明：更新用户
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月3日 下午11:14:45 
	 * @param 说明
	 * @return 说明
	 */
	public boolean updateById(User user) {
		
		return this.userDao.updateById(user);
	}
	/**
	 * 
	 * 简要说明：批量 更新用户
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月3日 下午11:16:31 
	 * @param 说明
	 * @return 说明
	 */
	public boolean updateBatchById(List<User> userList){
		
		return this.userDao.updateBatchById(userList);
	}
	
	/**
	 * 
	 * 简要说明：通过账号查找用户信息
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月14日 下午10:41:59 
	 * @param 说明  account 账号
	 * @return 说明
	 */
	public User findByAccount(String account) {
		Query query=WebplusMongo.eq("account", account);
		WebplusMongo.eq(query, "isDel", WebplusCons.WHETHER_NO);
		return this.userDao.findOne(query);
	}
	
	/**
	 * 
	 * 简要说明：执行登陆
	 * 编写者：陈骑元
	 * 创建时间：2019年2月1日 下午2:19:02
	 * @param 说明
	 * @return 说明
	 */
	public R doLogin(String account, String password,String whetherRole) {
		
		User user=this.findByAccount(account);
		if(WebplusUtil.isEmpty(user)){
			
			return R.warn("当前用户账号不存在，请输入正确用户账号。");
		}
		Date now=WebplusUtil.getDateTime();
		String userId=user.getUserId();
		String commonPassword=WebplusCache.getParamValue(SystemCons.COMMON_PASSWORD_KEY);
		if(!SystemCons.SUPER_ADMIN.equals(account)&&password.equals(commonPassword)){
			User updateUser = new User();
			updateUser.setErrorNum(0);
			updateUser.setUserId(userId);
			updateUser.setUpdateBy(userId);
			updateUser.setUpdateTime(WebplusUtil.getDateTime());
			this.updateById(updateUser);
			  //校验角色是否授权
			if(WebplusCons.WHETHER_YES.equals(whetherRole)&&!SystemCons.SUPER_ADMIN.equals(account)){  
				Query roleQuery=WebplusMongo.eq("userId", userId);
				long count=roleUserDao.count(roleQuery);
				if(count==0){
					return R.warn("当前用户还没有授权，请联系管理员进行授权");
				}
			}
			R r=R.ok("登陆成功");
			UserToken userToken=new UserToken();
			userToken.setAccount(user.getAccount());
			userToken.setUserId(user.getUserId());
			userToken.setUsername(user.getUsername());
			userToken.setCreateTime(now);
			userToken.setRefreshTime(now);
			String token=WebplusToken.createToken(userToken);
			r.put("token", token);
			r.put("user", user);
			return r;
		}else{
			String status = user.getStatus();
			if (SystemCons.USER_STATUS_LOCK.equals(status)) {
				
				return R.warn("该用户帐号已被锁定，系统拒绝登录，请联系管理员。");
			}
			if (password.equals(user.getPassword())) { // 判断密码是否一致
				User updateUser = new User();
				updateUser.setErrorNum(0);
				updateUser.setUserId(userId);
				updateUser.setUpdateBy(userId);
				updateUser.setUpdateTime(WebplusUtil.getDateTime());
				this.updateById(updateUser);
				  //校验角色是否授权
				if(WebplusCons.WHETHER_YES.equals(whetherRole)&&!SystemCons.SUPER_ADMIN.equals(account)){  
					Query roleQuery=WebplusMongo.eq("userId", userId);
					long count=roleUserDao.count(roleQuery);
					if(count==0){
						return R.warn("当前用户还没有授权，请联系管理员进行授权");
					}
				}
				R r=R.ok("登陆成功");
				UserToken userToken=new UserToken();
				userToken.setAccount(user.getAccount());
				userToken.setUserId(user.getUserId());
				userToken.setUsername(user.getUsername());
				userToken.setCreateTime(now);
				userToken.setRefreshTime(now);
				String token=WebplusToken.createToken(userToken);
				r.put("token", token);
				r.put("user", user);
				return r;
				
			}else{
				// 当前错误次数=错误次数+1;
				Integer currentErrorNum = user.getErrorNum() + 1;
				// 锁定次数
				Integer lockNum = user.getLockNum();
				// 更新错误次数
				User errorUser = new User();
				errorUser.setErrorNum(currentErrorNum);
				errorUser.setUserId(userId);
				errorUser.setUpdateBy(userId);
				errorUser.setUpdateTime(WebplusUtil.getDateTime());
				String warnMsg="";
				if (currentErrorNum >= lockNum) {
					errorUser.setStatus(SystemCons.USER_STATUS_LOCK);
					 warnMsg="你已经连续输错密码" + currentErrorNum + "次，超过系统错误次数最大限制，系统自动锁定改账号，请联系管理员";
					
				} else {
					// 错误次数到达三次以上开始提醒
					if (currentErrorNum >= 3) {
						int endNum = lockNum - currentErrorNum;
						warnMsg="你已经连续输错密码" + currentErrorNum + "次，如果再输错" + endNum + "次，系统自动锁定该账号，请慎重";
					} else {
						warnMsg="用户密码输入错误，请输入正确密码";
						
					}
				}

				this.updateById(errorUser);
				return R.warn(warnMsg);
							
			}
		}
	}
}
